home *** CD-ROM | disk | FTP | other *** search
/ PCMania 44 / PCMania CD44_1.iso / pcmania / treal44 / 3dtoshi / w3d.asm < prev    next >
Assembly Source File  |  1995-12-01  |  20KB  |  1,195 lines

  1.  
  2. ; w3d.asm
  3. ;
  4. ; Copyright (c) 1995 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. PUBLIC SetViewRegion_, SetLeftRight_, SetIntensities_, SetGShadeTable_ 
  7. PUBLIC SetUData_, SetVData_, SetImageBuffer_, SetFShadeTable_
  8. PUBLIC DrawSimpleTriangle_, DrawClippedTriangle_
  9. PUBLIC DrawGShadeTriangle_, DrawClippedGShade_
  10. PUBLIC DrawTexTriangle_, DrawClippedTex_
  11. PUBLIC DrawFTexTriangle_, DrawClippedFTex_
  12. PUBLIC DrawGTexTriangle_, DrawClippedGTex_
  13.  
  14. .DATA
  15.   x1      DD 0
  16.   x2      DD 0
  17.   Vx1     DD 0
  18.   Vx2     DD 0
  19.   Dx1     DD 0
  20.   Dx2     DD 0
  21.   I1      DD 0
  22.   I2      DD 0
  23.   dI1     DD 0
  24.   dI2     DD 0
  25.   DeltaI  DD 0
  26.   ShadeTable DD 0
  27.   FShadeTable DD 0
  28.   AddDest DD 0
  29.   Color   DD 0
  30.   TempVar DD 0
  31.   DestBuffer DD 0
  32.   TriWd   DD 0
  33.   ImageBuffer DD 0
  34.   u1      DD 0
  35.   u2      DD 0
  36.   v1      DD 0
  37.   v2      DD 0
  38.   Tmpu1   DD 0
  39.   Tmpv1   DD 0
  40.   Du1     DD 0
  41.   Du2     DD 0
  42.   Dv1     DD 0
  43.   Dv2     DD 0
  44.   DeltaU  DD 0
  45.   DeltaV  DD 0
  46.   LoopCount DD 0
  47.  
  48. .CODE
  49. .386
  50.  
  51. ; VOID SetUData ( LONG u1, LONG u2, LONG Du1, LONG Du2 )
  52. ;
  53. ; EAX = u1, EDX = u2, EBX = Du1, ECX = Du2
  54.  
  55. SetUData_ PROC C
  56.   mov  u1, EAX
  57.   mov  u2, EDX
  58.   mov  Du1, EBX
  59.   mov  Du2, ECX
  60.   ret
  61. SetUData_ ENDP
  62.  
  63.  
  64. ; VOID SetVData ( LONG v1, LONG v2, LONG Dv1, LONG Dv2 )
  65. ;
  66. ; EAX = v1, EDX = v2, EBX = Dv1, ECX = Dv2
  67.  
  68. SetVData_ PROC C
  69.   mov  v1, EAX
  70.   mov  v2, EDX
  71.   mov  Dv1, EBX
  72.   mov  Dv2, ECX
  73.   ret
  74. SetVData_ ENDP
  75.  
  76.  
  77. ; VOID SetImageBuffer ( BYTE *Buffer )
  78. ;
  79. ; EAX = Buffer
  80.  
  81. SetImageBuffer_ PROC C
  82.   mov  ImageBuffer, EAX
  83.   ret
  84. SetImageBuffer_ ENDP
  85.  
  86.  
  87. ; VOID SetViewRegion ( LONG x1, LONG x2 )
  88. ;
  89. ; EAX = x1, EDX = x2
  90.  
  91. SetViewRegion_ PROC C
  92.   mov  Vx1, EAX
  93.   mov  Vx2, EDX
  94.   ret
  95. SetViewRegion_ ENDP
  96.  
  97.  
  98. ; VOID SetLeftRight ( LONG x1, LONG x2, LONG Dx1, LONG Dx2 )
  99. ;
  100. ; EAX = x1, EDX = x2, EBX = Dx1, ECX = Dx2
  101.  
  102. SetLeftRight_ PROC
  103.   mov  x1, EAX
  104.   mov  x2, EDX
  105.   mov  Dx1, EBX
  106.   mov  Dx2, ECX  
  107.   ret
  108. SetLeftRight_ ENDP
  109.  
  110.  
  111. ; VOID SetGShadeTable ( BYTE *Table )
  112. ;
  113. ; EAX = Table
  114.  
  115. SetGShadeTable_ PROC C
  116.   mov  ShadeTable, EAX
  117.   ret
  118. SetGShadeTable_ ENDP
  119.  
  120.  
  121. ; VOID SetFShadeTable ( BYTE *Table )
  122. ;
  123. ; EAX = Table
  124.  
  125. SetFShadeTable_ PROC C
  126.   mov  FShadeTable, EAX
  127.   ret
  128. SetFShadeTable_ ENDP
  129.  
  130.  
  131. ; VOID SetIntensities ( LONG I1, LONG I2, LONG dI1, LONG dI2 )
  132. ;
  133. ; EAX = I1, EDX = I2, EBX = dI1, ECX = dI2
  134.  
  135. SetIntensities_ PROC
  136.   mov  I1, EAX
  137.   mov  I2, EDX
  138.   mov  dI1, EBX
  139.   mov  dI2, ECX  
  140.   ret
  141. SetIntensities_ ENDP
  142.  
  143.  
  144. ; VOID DrawSimpleTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  145. ;
  146. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  147.  
  148. DrawSimpleTriangle_ PROC C
  149.   push EBP
  150.   push EDI
  151.   push ESI
  152.  
  153.   mov  EDI, EAX
  154.  
  155.   mov  AL, BL
  156.   mov  AH, AL
  157.   mov  BX, AX
  158.   shl  EAX, 16
  159.   mov  AX, BX
  160.  
  161.   mov  Color, EAX
  162.  
  163.   mov  EBP, ECX
  164.   cld
  165.     
  166.   LoopSimple :
  167.     mov  EAX, x1
  168.     mov  EBX, x2
  169.     sar  EAX, 16
  170.     sar  EBX, 16
  171.  
  172.     mov  ECX, EBX
  173.     sub  ECX, EAX
  174.     inc  ECX
  175.     
  176.     mov  DestBuffer, EDI
  177.  
  178.     mov  ESI, ECX
  179.     shr  ECX, 2
  180.     and  ESI, 3
  181.     add  EDI, EAX
  182.     mov  EAX, Color
  183.     rep  stosd
  184.     mov  ECX, ESI
  185.     rep  stosb
  186.     
  187.     mov  EAX, Dx1
  188.     mov  EBX, Dx2
  189.     mov  EDI, DestBuffer
  190.     add  x1, EAX
  191.     add  x2, EBX
  192.     add  EDI, EDX
  193.     dec  EBP
  194.     jnz  LoopSimple 
  195.    
  196.   EndDrawSimple : 
  197.   pop  ESI
  198.   pop  EDI
  199.   pop  EBP  
  200.   ret
  201. DrawSimpleTriangle_ ENDP
  202.  
  203.  
  204. ; VOID DrawClippedTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  205. ;
  206. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  207.  
  208. DrawClippedTriangle_ PROC C
  209.   push EBP
  210.   push EDI
  211.   push ESI
  212.  
  213.   mov  EDI, EAX
  214.  
  215.   mov  AL, BL
  216.   mov  AH, AL
  217.   mov  BX, AX
  218.   shl  EAX, 16
  219.   mov  AX, BX
  220.  
  221.   mov  Color, EAX
  222.  
  223.   mov  EBP, ECX
  224.   cld
  225.     
  226.   LoopClipped :
  227.     mov  EAX, x1
  228.     mov  EBX, x2
  229.     sar  EAX, 16
  230.     sar  EBX, 16
  231.  
  232.     ; Do clipping
  233.     cmp  EAX, Vx2
  234.     jg   SkipThisRow
  235.     cmp  EBX, Vx1
  236.     jl   SkipThisRow
  237.     cmp  EAX, Vx1    
  238.     jge  CheckRight   
  239.     mov  EAX, Vx1
  240.      
  241.   CheckRight :  
  242.     cmp  EBX, Vx2    
  243.     jle  StartDraw
  244.     mov  EBX, Vx2
  245.   
  246.   StartDraw :
  247.     mov  ECX, EBX
  248.     sub  ECX, EAX
  249.     inc  ECX
  250.     
  251.     mov  DestBuffer, EDI
  252.  
  253.     mov  ESI, ECX
  254.     shr  ECX, 2
  255.     and  ESI, 3
  256.     add  EDI, EAX
  257.     mov  EAX, Color
  258.     rep  stosd
  259.     mov  ECX, ESI
  260.     rep  stosb
  261.     
  262.     mov  EDI, DestBuffer
  263.     
  264.   SkipThisRow :  
  265.     mov  EAX, Dx1
  266.     mov  EBX, Dx2
  267.     add  x1, EAX
  268.     add  x2, EBX
  269.     add  EDI, EDX
  270.     dec  EBP
  271.     jnz  LoopClipped
  272.    
  273.   EndDrawClipped : 
  274.   pop  ESI
  275.   pop  EDI
  276.   pop  EBP  
  277.   ret
  278. DrawClippedTriangle_ ENDP
  279.  
  280.  
  281. ; VOID DrawGShadeTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  282. ;
  283. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  284.  
  285. DrawGShadeTriangle_ PROC C
  286.   push EBP
  287.   push EDI
  288.   push ESI
  289.  
  290.   mov  EDI, EAX
  291.   mov  AddDest, EDX
  292.  
  293.   mov  Color, EBX
  294.   
  295.   mov  EBP, ECX
  296.   cld
  297.     
  298.   LoopGShade :
  299.     mov  EAX, x1
  300.     mov  EBX, x2
  301.     sar  EAX, 16
  302.     sar  EBX, 16
  303.  
  304.     mov  ECX, EBX
  305.     sub  ECX, EAX
  306.     inc  ECX
  307.     
  308.     mov  DestBuffer, EDI
  309.  
  310.     add  EDI, EAX
  311.     mov  EAX, I2
  312.     mov  EBX, I1
  313.     sub  EAX, EBX
  314.     mov  EDX, EAX
  315.     sar  EDX, 01Fh
  316.     idiv ECX
  317.     mov  DeltaI, EAX
  318.     mov  ESI, EBX
  319.     mov  EAX, Color
  320.     push EBP
  321.     mov  EBP, ShadeTable    
  322.     
  323.     LoopInGShade :
  324.       mov  EBX, ESI
  325.       add  ESI, DeltaI
  326.       shr  EBX, 16
  327.       mov  BL, AL
  328.       add  EBX, EBP
  329.       mov  DL, [EBX]
  330.       mov  [EDI], DL
  331.       inc  EDI
  332.       loop LoopInGShade
  333.     
  334.     pop  EBP
  335.     mov  EAX, Dx1
  336.     mov  EBX, Dx2
  337.     mov  EDI, DestBuffer
  338.     add  x1, EAX
  339.     add  x2, EBX
  340.     
  341.     add  EDI, AddDest
  342.     
  343.     mov  EAX, dI1
  344.     mov  EBX, dI2
  345.     add  I1, EAX
  346.     add  I2, EBX
  347.     dec  EBP
  348.     jnz  LoopGShade 
  349.    
  350.   EndDrawGShade : 
  351.   pop  ESI
  352.   pop  EDI
  353.   pop  EBP  
  354.   ret
  355. DrawGShadeTriangle_ ENDP
  356.  
  357.  
  358. ; VOID DrawClippedGShade ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  359. ;
  360. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  361.  
  362. DrawClippedGShade_ PROC C
  363.   push EBP
  364.   push EDI
  365.   push ESI
  366.  
  367.   mov  EDI, EAX
  368.   mov  AddDest, EDX
  369.  
  370.   mov  Color, EBX
  371.   
  372.   mov  EBP, ECX
  373.   cld
  374.     
  375.   LoopClippedGShade :
  376.     mov  EAX, x1
  377.     mov  EBX, x2
  378.     sar  EAX, 16
  379.     sar  EBX, 16
  380.     mov  ESI, 0
  381.  
  382.     mov  ECX, EBX
  383.     sub  ECX, EAX
  384.     inc  ECX
  385.     mov  TriWd, ECX 
  386.     
  387.     ; Do clipping
  388.     cmp  EAX, Vx2
  389.     jg   SkipThisRowClipped
  390.     cmp  EBX, Vx1
  391.     jl   SkipThisRowClipped
  392.     cmp  EAX, Vx1    
  393.     jge  CheckRightClipped 
  394.     mov  ESI, Vx1
  395.     sub  ESI, EAX  
  396.     mov  EAX, Vx1
  397.      
  398.   CheckRightClipped :  
  399.     cmp  EBX, Vx2    
  400.     jle  StartDrawClipped
  401.     sub  EBX, Vx2
  402.     sub  ECX, EBX
  403.     mov  EBX, Vx2
  404.   
  405.   StartDrawClipped :
  406.     mov  DestBuffer, EDI
  407.     add  EDI, EAX
  408.  
  409.     mov  EAX, I2
  410.     mov  EBX, I1
  411.     sub  EAX, EBX
  412.     mov  EDX, EAX
  413.     sar  EDX, 01Fh
  414.     idiv TriWd
  415.     sub  ECX, ESI
  416.  
  417.     mov  DeltaI, EAX
  418.  
  419.     imul ESI
  420.     mov  ESI, EBX
  421.     add  ESI, EAX
  422.     mov  EAX, Color
  423.     push EBP
  424.     mov  EBP, ShadeTable    
  425.     
  426.     LoopInClippedGShade :
  427.       mov  EBX, ESI
  428.       add  ESI, DeltaI
  429.       shr  EBX, 16
  430.       mov  BL, AL
  431.       add  EBX, EBP
  432.       mov  DL, [EBX]
  433.       mov  [EDI], DL
  434.       inc  EDI
  435.       loop LoopInClippedGShade
  436.     
  437.     pop  EBP
  438.     mov  EDI, DestBuffer
  439.     
  440.   SkipThisRowClipped :  
  441.   
  442.     mov  EAX, Dx1
  443.     mov  EBX, Dx2
  444.     add  x1, EAX
  445.     add  x2, EBX
  446.     
  447.     add  EDI, AddDest
  448.     
  449.     mov  EAX, dI1
  450.     mov  EBX, dI2
  451.     add  I1, EAX
  452.     add  I2, EBX
  453.     dec  EBP
  454.     jnz  LoopClippedGShade 
  455.    
  456.   EndDrawClippedGShade : 
  457.   pop  ESI
  458.   pop  EDI
  459.   pop  EBP  
  460.   ret
  461. DrawClippedGShade_ ENDP
  462.  
  463.  
  464. ; VOID DrawTexTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  465. ;
  466. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  467.  
  468. DrawTexTriangle_ PROC C
  469.   push EBP
  470.   push EDI
  471.   push ESI
  472.  
  473.   mov  EDI, EAX
  474.   mov  AddDest, EDX
  475.  
  476.   mov  Color, EBX
  477.   
  478.   mov  EBP, ECX
  479.   cld
  480.     
  481.   LoopTex :
  482.     mov  EAX, x1
  483.     mov  EBX, x2
  484.     sar  EAX, 16
  485.     sar  EBX, 16
  486.  
  487.     mov  ECX, EBX
  488.     sub  ECX, EAX
  489.     inc  ECX
  490.     
  491.     mov  DestBuffer, EDI
  492.  
  493.     add  EDI, EAX
  494.     
  495.     mov  EAX, u2
  496.     mov  EBX, u1
  497.     sub  EAX, EBX
  498.     mov  EDX, EAX
  499.     sar  EDX, 01Fh
  500.     idiv ECX
  501.     sar  EAX, 8
  502.     mov  DeltaU, EAX
  503.     
  504.     mov  EAX, v2
  505.     mov  EBX, v1
  506.     sub  EAX, EBX
  507.     mov  EDX, EAX
  508.     sar  EDX, 01Fh
  509.     idiv ECX
  510.     mov  DeltaV, EAX
  511.     
  512.     mov  ESI, ImageBuffer
  513.     mov  EAX, u1
  514.     shr  EAX, 8
  515.     push EBP
  516.     mov  EBP, v1
  517.     
  518.     LoopInTex :
  519.       mov  EBX, EBP
  520.       add  EBP, DeltaV
  521.       mov  BX, AX
  522.       add  EAX, DeltaU
  523.       shr  EBX, 8
  524.       add  EBX, ESI
  525.       mov  DL, [EBX]
  526.       mov  [EDI], DL            
  527.       inc  EDI
  528.       loop LoopInTex
  529.     
  530.     pop  EBP
  531.     mov  EAX, Dx1
  532.     mov  EBX, Dx2
  533.     mov  EDI, DestBuffer
  534.     add  x1, EAX
  535.     add  x2, EBX
  536.     
  537.     add  EDI, AddDest
  538.     
  539.     mov  EAX, Du1
  540.     mov  EBX, Du2
  541.     add  u1, EAX
  542.     add  u2, EBX
  543.     
  544.     mov  EAX, Dv1
  545.     mov  EBX, Dv2
  546.     add  v1, EAX
  547.     add  v2, EBX
  548.     
  549.     dec  EBP
  550.     jnz  LoopTex 
  551.    
  552.   EndDrawTex : 
  553.   pop  ESI
  554.   pop  EDI
  555.   pop  EBP  
  556.   ret
  557. DrawTexTriangle_ ENDP
  558.  
  559.  
  560. ; VOID DrawClippedTex ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  561. ;
  562. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  563.  
  564. DrawClippedTex_ PROC C
  565.   push EBP
  566.   push EDI
  567.   push ESI
  568.  
  569.   mov  EDI, EAX
  570.   mov  AddDest, EDX
  571.  
  572.   mov  Color, EBX
  573.   
  574.   mov  EBP, ECX
  575.   cld
  576.     
  577.   LoopClippedTex :
  578.     mov  EAX, x1
  579.     mov  EBX, x2
  580.     sar  EAX, 16
  581.     sar  EBX, 16
  582.     mov  ESI, 0
  583.  
  584.     mov  ECX, EBX
  585.     sub  ECX, EAX
  586.     inc  ECX
  587.     mov  TriWd, ECX
  588.     
  589.     ; Do clipping
  590.     cmp  EAX, Vx2
  591.     jg   SkipThisRowClippedTex
  592.     cmp  EBX, Vx1
  593.     jl   SkipThisRowClippedTex
  594.     cmp  EAX, Vx1    
  595.     jge  CheckRightClippedTex
  596.     mov  ESI, Vx1
  597.     sub  ESI, EAX  
  598.     mov  EAX, Vx1
  599.      
  600.   CheckRightClippedTex :  
  601.     cmp  EBX, Vx2    
  602.     jle  StartDrawClippedTex
  603.     sub  EBX, Vx2
  604.     sub  ECX, EBX
  605.     mov  EBX, Vx2
  606.   
  607.   StartDrawClippedTex :
  608.     mov  DestBuffer, EDI
  609.  
  610.     add  EDI, EAX
  611.     
  612.     mov  EAX, u2
  613.     mov  EBX, u1
  614.     mov  Tmpu1, EBX
  615.     sub  EAX, EBX
  616.     mov  EDX, EAX
  617.     sar  EDX, 01Fh
  618.     idiv TriWd
  619.     mov  DeltaU, EAX
  620.     
  621.     imul ESI
  622.     add  Tmpu1, EAX
  623.     sar  DeltaU, 8
  624.  
  625.     mov  EAX, v2
  626.     mov  EBX, v1
  627.     mov  Tmpv1, EBX
  628.     sub  EAX, EBX
  629.     mov  EDX, EAX
  630.     sar  EDX, 01Fh
  631.     idiv TriWd
  632.     mov  DeltaV, EAX
  633.     
  634.     imul ESI
  635.     add  Tmpv1, EAX
  636.  
  637.     sub  ECX, ESI
  638.     mov  EAX, Tmpu1
  639.     sar  EAX, 8
  640.  
  641.     mov  ESI, ImageBuffer
  642.     push EBP
  643.     mov  EBP, Tmpv1
  644.     
  645.     LoopInClippedTex :
  646.       mov  EBX, EBP
  647.       add  EBP, DeltaV
  648.       mov  BX, AX
  649.       add  EAX, DeltaU
  650.       shr  EBX, 8
  651.       add  EBX, ESI
  652.       mov  DL, [EBX]
  653.       mov  [EDI], DL            
  654.       inc  EDI
  655.       loop LoopInClippedTex
  656.  
  657.     pop  EBP
  658.     mov  EDI, DestBuffer
  659.  
  660.   SkipThisRowClippedTex :  
  661.     mov  EAX, Dx1
  662.     mov  EBX, Dx2
  663.     add  x1, EAX
  664.     add  x2, EBX
  665.     
  666.     add  EDI, AddDest
  667.     
  668.     mov  EAX, Du1
  669.     mov  EBX, Du2
  670.     add  u1, EAX
  671.     add  u2, EBX
  672.     
  673.     mov  EAX, Dv1
  674.     mov  EBX, Dv2
  675.     add  v1, EAX
  676.     add  v2, EBX
  677.     
  678.     dec  EBP
  679.     jnz  LoopClippedTex 
  680.    
  681.   EndDrawClippedTex : 
  682.   pop  ESI
  683.   pop  EDI
  684.   pop  EBP  
  685.   ret
  686. DrawClippedTex_ ENDP
  687.  
  688.  
  689. ; VOID DrawFTexTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  690. ;
  691. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  692.  
  693. DrawFTexTriangle_ PROC C
  694.   push EBP
  695.   push EDI
  696.   push ESI
  697.  
  698.   mov  EDI, EAX
  699.   mov  AddDest, EDX
  700.  
  701.   mov  Color, EBX
  702.   
  703.   mov  EBP, ECX
  704.   cld
  705.     
  706.   LoopFTex :
  707.     mov  EAX, x1
  708.     mov  EBX, x2
  709.     sar  EAX, 16
  710.     sar  EBX, 16
  711.  
  712.     mov  ECX, EBX
  713.     sub  ECX, EAX
  714.     inc  ECX
  715.     
  716.     mov  DestBuffer, EDI
  717.  
  718.     add  EDI, EAX
  719.     
  720.     mov  EAX, u2
  721.     mov  EBX, u1
  722.     sub  EAX, EBX
  723.     mov  EDX, EAX
  724.     sar  EDX, 01Fh
  725.     idiv ECX
  726.     sar  EAX, 8
  727.     mov  DeltaU, EAX
  728.     
  729.     mov  EAX, v2
  730.     mov  EBX, v1
  731.     sub  EAX, EBX
  732.     mov  EDX, EAX
  733.     sar  EDX, 01Fh
  734.     idiv ECX
  735.     mov  DeltaV, EAX
  736.     
  737.     mov  ESI, ImageBuffer
  738.     mov  EAX, u1
  739.     shr  EAX, 8
  740.     push EBP
  741.     mov  EBP, v1
  742.     
  743.     LoopInFTex :
  744.       mov  EBX, EBP
  745.       mov  EDX, 0
  746.       mov  BX, AX
  747.       shr  EBX, 8
  748.       add  EBX, ESI
  749.       mov  DL, [EBX]
  750.       add  EDX, FShadeTable
  751.       add  EAX, DeltaU
  752.       add  EBP, DeltaV
  753.       mov  BL, [EDX]
  754.       mov  [EDI], BL            
  755.       inc  EDI
  756.       loop LoopInFTex
  757.     
  758.     pop  EBP
  759.     mov  EAX, Dx1
  760.     mov  EBX, Dx2
  761.     mov  EDI, DestBuffer
  762.     add  x1, EAX
  763.     add  x2, EBX
  764.     
  765.     add  EDI, AddDest
  766.     
  767.     mov  EAX, Du1
  768.     mov  EBX, Du2
  769.     add  u1, EAX
  770.     add  u2, EBX
  771.     
  772.     mov  EAX, Dv1
  773.     mov  EBX, Dv2
  774.     add  v1, EAX
  775.     add  v2, EBX
  776.     
  777.     dec  EBP
  778.     jnz  LoopFTex 
  779.    
  780.   EndDrawFTex : 
  781.   pop  ESI
  782.   pop  EDI
  783.   pop  EBP  
  784.   ret
  785. DrawFTexTriangle_ ENDP
  786.  
  787.  
  788. ; VOID DrawClippedFTex ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  789. ;
  790. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  791.  
  792. DrawClippedFTex_ PROC C
  793.   push EBP
  794.   push EDI
  795.   push ESI
  796.  
  797.   mov  EDI, EAX
  798.   mov  AddDest, EDX
  799.  
  800.   mov  Color, EBX
  801.   
  802.   mov  EBP, ECX
  803.   cld
  804.     
  805.   LoopClippedFTex :
  806.     mov  EAX, x1
  807.     mov  EBX, x2
  808.     sar  EAX, 16
  809.     sar  EBX, 16
  810.     mov  ESI, 0
  811.  
  812.     mov  ECX, EBX
  813.     sub  ECX, EAX
  814.     inc  ECX
  815.     mov  TriWd, ECX
  816.     
  817.     ; Do clipping
  818.     cmp  EAX, Vx2
  819.     jg   SkipThisRowClippedFTex
  820.     cmp  EBX, Vx1
  821.     jl   SkipThisRowClippedFTex
  822.     cmp  EAX, Vx1    
  823.     jge  CheckRightClippedFTex
  824.     mov  ESI, Vx1
  825.     sub  ESI, EAX  
  826.     mov  EAX, Vx1
  827.      
  828.   CheckRightClippedFTex :  
  829.     cmp  EBX, Vx2    
  830.     jle  StartDrawClippedFTex
  831.     sub  EBX, Vx2
  832.     sub  ECX, EBX
  833.     mov  EBX, Vx2
  834.   
  835.   StartDrawClippedFTex :
  836.     mov  DestBuffer, EDI
  837.  
  838.     add  EDI, EAX
  839.     
  840.     mov  EAX, u2
  841.     mov  EBX, u1
  842.     mov  Tmpu1, EBX
  843.     sub  EAX, EBX
  844.     mov  EDX, EAX
  845.     sar  EDX, 01Fh
  846.     idiv TriWd
  847.     mov  DeltaU, EAX
  848.     
  849.     imul ESI
  850.     add  Tmpu1, EAX
  851.     sar  DeltaU, 8
  852.  
  853.     mov  EAX, v2
  854.     mov  EBX, v1
  855.     mov  Tmpv1, EBX
  856.     sub  EAX, EBX
  857.     mov  EDX, EAX
  858.     sar  EDX, 01Fh
  859.     idiv TriWd
  860.     mov  DeltaV, EAX
  861.     
  862.     imul ESI
  863.     add  Tmpv1, EAX
  864.  
  865.     sub  ECX, ESI
  866.     mov  EAX, Tmpu1
  867.     sar  EAX, 8
  868.  
  869.     mov  ESI, ImageBuffer
  870.     push EBP
  871.     mov  EBP, Tmpv1
  872.     
  873.     LoopInClippedFTex :
  874.       mov  EBX, EBP
  875.       mov  EDX, 0
  876.       mov  BX, AX
  877.       shr  EBX, 8
  878.       add  EBX, ESI
  879.       mov  DL, [EBX]
  880.       add  EDX, FShadeTable
  881.       add  EBP, DeltaV
  882.       add  EAX, DeltaU
  883.       mov  BL, [EDX]
  884.       mov  [EDI], BL
  885.       inc  EDI
  886.       loop LoopInClippedFTex
  887.  
  888.     pop  EBP
  889.     mov  EDI, DestBuffer
  890.  
  891.   SkipThisRowClippedFTex :  
  892.     mov  EAX, Dx1
  893.     mov  EBX, Dx2
  894.     add  x1, EAX
  895.     add  x2, EBX
  896.     
  897.     add  EDI, AddDest
  898.     
  899.     mov  EAX, Du1
  900.     mov  EBX, Du2
  901.     add  u1, EAX
  902.     add  u2, EBX
  903.     
  904.     mov  EAX, Dv1
  905.     mov  EBX, Dv2
  906.     add  v1, EAX
  907.     add  v2, EBX
  908.     
  909.     dec  EBP
  910.     jnz  LoopClippedFTex 
  911.    
  912.   EndDrawClippedFTex : 
  913.   pop  ESI
  914.   pop  EDI
  915.   pop  EBP  
  916.   ret
  917. DrawClippedFTex_ ENDP
  918.  
  919.  
  920. ; VOID DrawGTexTriangle ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  921. ;
  922. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  923.  
  924. DrawGTexTriangle_ PROC C
  925.   push EBP
  926.   push EDI
  927.   push ESI
  928.  
  929.   mov  EDI, EAX
  930.   mov  AddDest, EDX
  931.  
  932.   mov  Color, EBX
  933.   
  934.   mov  EBP, ECX
  935.   cld
  936.     
  937.   LoopGTex :
  938.     mov  EAX, x1
  939.     mov  EBX, x2
  940.     sar  EAX, 16
  941.     sar  EBX, 16
  942.  
  943.     mov  ECX, EBX
  944.     sub  ECX, EAX
  945.     inc  ECX
  946.     
  947.     mov  DestBuffer, EDI
  948.  
  949.     add  EDI, EAX
  950.     
  951.     mov  EAX, u2
  952.     mov  EBX, u1
  953.     sub  EAX, EBX
  954.     mov  EDX, EAX
  955.     sar  EDX, 01Fh
  956.     idiv ECX
  957.     sar  EAX, 8
  958.     mov  DeltaU, EAX
  959.     
  960.     mov  EAX, v2
  961.     mov  EBX, v1
  962.     sub  EAX, EBX
  963.     mov  EDX, EAX
  964.     sar  EDX, 01Fh
  965.     idiv ECX
  966.     mov  DeltaV, EAX
  967.     
  968.     mov  EAX, I2
  969.     mov  EBX, I1
  970.     sub  EAX, EBX
  971.     mov  EDX, EAX
  972.     sar  EDX, 01Fh
  973.     idiv ECX
  974.     mov  DeltaI, EAX
  975.  
  976.     mov  LoopCount, ECX
  977.     mov  ECX, I1
  978.     mov  EAX, u1
  979.     shr  EAX, 8
  980.     mov  ESI, ImageBuffer
  981.     push EBP
  982.     mov  EBP, v1
  983.     
  984.     LoopInGTex :
  985.       mov  EBX, EBP
  986.       mov  EDX, ECX
  987.       add  EBP, DeltaV
  988.       add  ECX, DeltaI
  989.       shr  EDX, 16
  990.       mov  BX, AX
  991.       add  EAX, DeltaU
  992.       shr  EBX, 8
  993.       add  EBX, ESI
  994.       mov  DL, [EBX]
  995.       add  EDX, ShadeTable
  996.       mov  BL, [EDX]
  997.       mov  [EDI], BL            
  998.       inc  EDI
  999.       dec  LoopCount
  1000.       jnz  LoopInGTex
  1001.     
  1002.     pop  EBP
  1003.     mov  EAX, Dx1
  1004.     mov  EBX, Dx2
  1005.     mov  EDI, DestBuffer
  1006.     add  x1, EAX
  1007.     add  x2, EBX
  1008.     
  1009.     add  EDI, AddDest
  1010.     
  1011.     mov  EAX, Du1
  1012.     mov  EBX, Du2
  1013.     add  u1, EAX
  1014.     add  u2, EBX
  1015.     
  1016.     mov  EAX, Dv1
  1017.     mov  EBX, Dv2
  1018.     add  v1, EAX
  1019.     add  v2, EBX
  1020.     
  1021.     mov  EAX, dI1
  1022.     mov  EBX, dI2
  1023.     add  I1, EAX
  1024.     add  I2, EBX
  1025.  
  1026.     dec  EBP
  1027.     jnz  LoopGTex 
  1028.    
  1029.   EndDrawGTex : 
  1030.   pop  ESI
  1031.   pop  EDI
  1032.   pop  EBP  
  1033.   ret
  1034. DrawGTexTriangle_ ENDP
  1035.  
  1036.  
  1037. ; VOID DrawClippedGTex ( BYTE *Buffer, LONG AddDest, BYTE Color, LONG Length )
  1038. ;
  1039. ; EAX = Buffer, EDX = AddDest, EBX = Color, ECX = Length
  1040.  
  1041. DrawClippedGTex_ PROC C
  1042.   push EBP
  1043.   push EDI
  1044.   push ESI
  1045.  
  1046.   mov  EDI, EAX
  1047.   mov  AddDest, EDX
  1048.  
  1049.   mov  Color, EBX
  1050.   
  1051.   mov  EBP, ECX
  1052.   cld
  1053.     
  1054.   LoopClippedGTex :
  1055.     mov  EAX, x1
  1056.     mov  EBX, x2
  1057.     sar  EAX, 16
  1058.     sar  EBX, 16
  1059.     mov  ESI, 0
  1060.  
  1061.     mov  ECX, EBX
  1062.     sub  ECX, EAX
  1063.     inc  ECX
  1064.     mov  TriWd, ECX
  1065.     
  1066.     ; Do clipping
  1067.     cmp  EAX, Vx2
  1068.     jg   SkipThisRowClippedGTex
  1069.     cmp  EBX, Vx1
  1070.     jl   SkipThisRowClippedGTex
  1071.     cmp  EAX, Vx1    
  1072.     jge  CheckRightClippedGTex
  1073.     mov  ESI, Vx1
  1074.     sub  ESI, EAX  
  1075.     mov  EAX, Vx1
  1076.      
  1077.   CheckRightClippedGTex :  
  1078.     cmp  EBX, Vx2    
  1079.     jle  StartDrawClippedGTex
  1080.     sub  EBX, Vx2
  1081.     sub  ECX, EBX
  1082.     mov  EBX, Vx2
  1083.   
  1084.   StartDrawClippedGTex :
  1085.     mov  DestBuffer, EDI
  1086.  
  1087.     add  EDI, EAX
  1088.     
  1089.     mov  EAX, u2
  1090.     mov  EBX, u1
  1091.     mov  Tmpu1, EBX
  1092.     sub  EAX, EBX
  1093.     mov  EDX, EAX
  1094.     sar  EDX, 01Fh
  1095.     idiv TriWd
  1096.     mov  DeltaU, EAX
  1097.     
  1098.     imul ESI
  1099.     add  Tmpu1, EAX
  1100.     sar  DeltaU, 8
  1101.  
  1102.     mov  EAX, v2
  1103.     mov  EBX, v1
  1104.     mov  Tmpv1, EBX
  1105.     sub  EAX, EBX
  1106.     mov  EDX, EAX
  1107.     sar  EDX, 01Fh
  1108.     idiv TriWd
  1109.     mov  DeltaV, EAX
  1110.     
  1111.     imul ESI
  1112.     add  Tmpv1, EAX
  1113.  
  1114.     mov  EAX, I2
  1115.     mov  EBX, I1
  1116.     sub  EAX, EBX
  1117.     mov  EDX, EAX
  1118.     sar  EDX, 01Fh
  1119.     idiv TriWd
  1120.     mov  DeltaI, EAX
  1121.  
  1122.     sub  ECX, ESI
  1123.  
  1124.     mov  LoopCount, ECX
  1125.  
  1126.     mov  ECX, I1
  1127.     imul ESI
  1128.     add  ECX, EAX
  1129.  
  1130.     mov  EAX, Tmpu1
  1131.     sar  EAX, 8
  1132.  
  1133.     mov  ESI, ImageBuffer
  1134.     push EBP
  1135.     mov  EBP, Tmpv1
  1136.     
  1137.     LoopInClippedGTex :
  1138.       mov  EBX, EBP
  1139.       mov  EDX, ECX
  1140.       add  EBP, DeltaV
  1141.       add  ECX, DeltaI
  1142.       shr  EDX, 16
  1143.       mov  BX, AX
  1144.       add  EAX, DeltaU
  1145.       shr  EBX, 8
  1146.       add  EBX, ESI
  1147.       mov  DL, [EBX]
  1148.       add  EDX, ShadeTable
  1149.       mov  BL, [EDX]
  1150.       mov  [EDI], BL            
  1151.       inc  EDI
  1152.       dec  LoopCount
  1153.       jnz LoopInClippedGTex
  1154.  
  1155.     pop  EBP
  1156.     mov  EDI, DestBuffer
  1157.  
  1158.   SkipThisRowClippedGTex :  
  1159.     mov  EAX, Dx1
  1160.     mov  EBX, Dx2
  1161.     add  x1, EAX
  1162.     add  x2, EBX
  1163.     
  1164.     add  EDI, AddDest
  1165.     
  1166.     mov  EAX, Du1
  1167.     mov  EBX, Du2
  1168.     add  u1, EAX
  1169.     add  u2, EBX
  1170.     
  1171.     mov  EAX, Dv1
  1172.     mov  EBX, Dv2
  1173.     add  v1, EAX
  1174.     add  v2, EBX
  1175.     
  1176.     mov  EAX, dI1
  1177.     mov  EBX, dI2
  1178.     add  I1, EAX
  1179.     add  I2, EBX
  1180.  
  1181.     dec  EBP
  1182.     jnz  LoopClippedGTex 
  1183.    
  1184.   EndDrawClippedGTex : 
  1185.   pop  ESI
  1186.   pop  EDI
  1187.   pop  EBP  
  1188.   ret
  1189. DrawClippedGTex_ ENDP
  1190.  
  1191.  
  1192. END
  1193.  
  1194.  
  1195.